package cn.com.surker.lab.service.impl;

import cn.com.surker.common.MessageCenterException;
import cn.com.surker.lab.dao.LabLevelOptimizeDao;
import cn.com.surker.lab.entity.LabLevelConstruct;
import cn.com.surker.lab.dao.LabLevelConstructDao;
import cn.com.surker.lab.entity.LabLevelOptimize;
import cn.com.surker.lab.service.LabLevelConstructService;
import cn.com.surker.lab.vo.LabLevelConstructVo;
import cn.com.surker.spring.RestResultDto;
import cn.com.surker.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 强度等级施工库表(用于上传工控机时候的参考) 服务实现类
 * </p>
 *
 * @author admin
 * @since 2024-09-23
 */
@Service
public class LabLevelConstructServiceImpl extends ServiceImpl<LabLevelConstructDao, LabLevelConstruct> implements LabLevelConstructService {

	@Resource
	protected LabLevelConstructDao labLevelConstructDao;
	@Resource
	protected LabLevelOptimizeDao levelOptimizeDao;

	/**
	 * 分页查询配合比列表
	 * @param searchVal
	 * @param strengthId
	 * @param offset
	 * @param limit
	 * @return
	 */
	public IPage findPage(String searchVal, Long strengthId, Integer status, Integer offset, Integer limit) {
		PageHelper.offsetPage(offset, limit);
		QueryWrapper<LabLevelConstruct> query = new QueryWrapper<>();
		if (StringUtils.isNull(status))
			status = 0;
		if (!StringUtils.isNull(status))
			query.eq("status", status);
		if (!StringUtils.isNull(strengthId))
			query.eq("strength_id", strengthId);
		if (!StringUtils.isNull(searchVal)) {
			query.and(orderWrapper -> orderWrapper.like("code", searchVal).or()
					.like("season", searchVal).or().like("remark", searchVal));
		}

		query.orderByDesc("create_time");

		IPage<LabLevelConstruct> iPage = labLevelConstructDao.selectPage(new Page<>((offset + limit) /limit, limit), query);
		/**分页插件**/
		if (!StringUtils.isNull(iPage.getRecords())) {
			PageInfo pageInfo = new PageInfo(iPage.getRecords());
			if (!StringUtils.isNull(pageInfo.getTotal()))
				iPage.setTotal(pageInfo.getTotal());
		}
		return iPage;
	}

	/**
	 * 根据强度等级查询生产配合比
	 * @param strengthId
	 * @return
	 */
	public List<LabLevelConstructVo> findLevel(Long strengthId) {
		if (StringUtils.isNull(strengthId))
			throw new MessageCenterException("强度等级参数错误");
		List<LabLevelConstructVo> list = labLevelConstructDao.findByStrength(strengthId);
		if (list == null || list.size() == 0)
			return null;
		return list;
	}

	/**
	 * 保存施工配比
	 * @param labLevelConstruct
	 * @return
	 */
	public RestResultDto saveLevel(LabLevelConstruct labLevelConstruct) {
		if (labLevelConstruct == null)
			throw new MessageCenterException("参数错误");
		if (StringUtils.isNull(labLevelConstruct.getCode()))
			throw new MessageCenterException("配合比编号为空");
		String levelCode = labLevelConstruct.getCode().toUpperCase().replaceAll(" ", "").replaceAll("（", "(")
				.replaceAll("）", ")").replaceAll("【", "[").replaceAll("】", "]");
		labLevelConstruct.setCode(levelCode);
		QueryWrapper<LabLevelConstruct> query = new QueryWrapper<>();
		query.eq("status", 0);
		query.eq("code", labLevelConstruct.getCode());
		labLevelConstruct.setCreateTime(new Date());
		LabLevelOptimize optimize = levelOptimizeDao.findByStrength(labLevelConstruct.getOrgId(), labLevelConstruct.getStrengthId());
		if (optimize != null) {
			labLevelConstruct.setOptimizeMaterialId(optimize.getId());
		}

		Integer total = labLevelConstructDao.selectCount(query);
		if (total > 0)
			throw new MessageCenterException("配合比编号已存在");
		Integer code = labLevelConstructDao.insert(labLevelConstruct);
		if (code > 0)
			return RestResultDto.success("保存成功",labLevelConstruct);
		throw new MessageCenterException("保存失败");
	}

	/**
	 * 修改施工配比
	 * @param labLevelConstruct
	 * @return
	 */
	public RestResultDto updateLevel(LabLevelConstruct labLevelConstruct) {
		if (labLevelConstruct == null || StringUtils.isNull(labLevelConstruct.getId()))
			throw new MessageCenterException("参数错误");
		LabLevelConstruct construct = labLevelConstructDao.selectById(labLevelConstruct.getId());
		if (construct == null || construct.getStatus().intValue() == 1)
			throw new MessageCenterException("业务数据不存在或已被禁用");
		if (!StringUtils.isNull(labLevelConstruct.getCode()) && !labLevelConstruct.getCode().equals(construct.getCode())) {
			String levelCode = labLevelConstruct.getCode().toUpperCase().replaceAll(" ", "").replaceAll("（", "(")
					.replaceAll("）", ")").replaceAll("【", "[").replaceAll("】", "]");
			QueryWrapper<LabLevelConstruct> queryWrapper = new QueryWrapper<>();
			queryWrapper.eq("status", 0);
			queryWrapper.eq("code", levelCode);
			Integer total = labLevelConstructDao.selectCount(queryWrapper);
			if (total > 0)
				throw new MessageCenterException("施工配比代号已存在~!");
			construct.setCode(levelCode);
		}
		if (StringUtils.isNull(labLevelConstruct.getOptimizeMaterialId())) {
			LabLevelOptimize optimize = levelOptimizeDao.findByStrength(labLevelConstruct.getOrgId(), labLevelConstruct.getStrengthId());
			if (optimize != null) {
				labLevelConstruct.setOptimizeMaterialId(optimize.getId());
			}
		}
		labLevelConstruct.setUpdateTime(new Date());
		Integer code = labLevelConstructDao.updateById(labLevelConstruct);
		if (code > 0)
			return RestResultDto.success("更新成功", labLevelConstruct);
		throw new MessageCenterException("更新失败~!");
	}

	/**
	 * 更新状态
	 * @param id
	 * @param status
	 * @param remark
	 * @param creator
	 * @return
	 */
	public RestResultDto updateStatus(Long id, Integer status, String remark, String creator) {
		if (StringUtils.isAllParamNull(id, status))
			throw new MessageCenterException("参数错误");
		LabLevelConstruct construct = labLevelConstructDao.selectById(id);
		if (construct == null)
			throw new MessageCenterException("业务数据不存在");
		construct.setStatus(status);
		construct.setUpdateTime(new Date());
		construct.setUpdator(creator);
		if (!StringUtils.isNull(remark))
			construct.setRemark(remark);
		Integer code = labLevelConstructDao.updateById(construct);
		if (code > 0)
			return RestResultDto.success("更新成功");
		throw new MessageCenterException("更新失败");
	}

}